#include "uisortdialog.h"
#include "uitoast.h"
#include <QLabel>
#include <QPushButton>
#include <QListView>
#include <QLayout>
#include <QStandardItemModel>
/**
 * 构造函数：创建一个排序对话框
 * @param fieldList 初始化排序字段列表
 * @param parent 父QWidget
 */
UiSortDialog::UiSortDialog(const QStringList &fieldList, QWidget *parent):UiConfirmDialog(parent),m_fieldList(fieldList)
{
    // 初始化排序字段标签和列表视图
    m_fieldLabel = new QLabel("排序字段",this);
    m_fieldListView = new UiSortListView(this);
    m_fieldListView->setItemDelegate(new CSortDelegate(m_fieldListView));
    m_fieldModel = new QStandardItemModel(m_fieldListView);
    m_fieldListView->setModel(m_fieldModel);
    for(auto f:fieldList) // 添加字段到列表
    {
        m_fieldModel->appendRow(new QStandardItem(f));
    }

    // 初始化排序方式标签和列表视图
    m_sortTypeLabel = new QLabel("排序方式",this);
    m_sortTypeListView = new UiSortListView(this);
    m_sortTypeListView->setItemDelegate(new CSortDelegate(m_sortTypeListView));
    m_sortTypeModel = new QStandardItemModel(m_sortTypeListView);
    m_sortTypeListView->setModel(m_sortTypeModel);
    auto asItem = new QStandardItem("升序");
    asItem->setData(Qt::AscendingOrder,Qt::UserRole);
    m_sortTypeModel->appendRow(asItem);
    auto dasItem = new QStandardItem("降序");
    dasItem->setData(Qt::DescendingOrder,Qt::UserRole);
    m_sortTypeModel->appendRow(dasItem);

    // 设置布局
    QVBoxLayout* panelLayout = new QVBoxLayout;
    panelLayout->setContentsMargins(0,0,0,0);
    panelLayout->setAlignment(Qt::AlignLeft);
    panelLayout->addWidget(m_fieldLabel);
    panelLayout->addWidget(m_fieldListView);
    panelLayout->addSpacing(20);
    panelLayout->addWidget(m_sortTypeLabel);
    panelLayout->addWidget(m_sortTypeListView);
    panelLayout->addStretch(0);
    this->addLayout(panelLayout);

    // 连接信号和槽
    connect(this,&UiConfirmDialog::sigConfirm,this,&UiSortDialog::slotConfirm);
    connect(this,&UiConfirmDialog::sigCancel,this,[=](){this->done(QDialog::Rejected);});
}

/**
 * 确认按钮的槽函数：验证选择并设置排序参数
 */
void UiSortDialog::slotConfirm()
{
    auto fieldIndexs = m_fieldListView->selectedIndexes();
    // 验证是否选择了排序字段
    if(fieldIndexs.size()<=0)
    {
        UiToast* toast = new UiToast(this);
        toast->setText("请选择排序字段");
        toast->show();
        return;
    }
    auto sortTypeIndexs = m_sortTypeListView->selectedIndexes();
    // 验证是否选择了排序方式
    if(sortTypeIndexs.size()<=0)
    {
        UiToast* toast = new UiToast(this);
        toast->setText("请选择排序方式");
        toast->show();
        return;
    }

    // 设置选择的排序字段和方式
    setField(fieldIndexs.at(0).data(Qt::DisplayRole).toString());
    setSortType(sortTypeIndexs.at(0).data(Qt::UserRole).value<Qt::SortOrder>());
    this->done(QDialog::Accepted);
}

QStringList UiSortDialog::fieldList() const
{
    return m_fieldList;
}

void UiSortDialog::setFieldList(const QStringList &fieldList)
{
    m_fieldList.clear();
    m_fieldModel->clear();
    m_fieldList = fieldList;

    for(auto f:m_fieldList) // 添加字段到列表
    {
        m_fieldModel->appendRow(new QStandardItem(f));
    }
}

void UiSortDialog::applySort(const QString &field, const Qt::SortOrder &sortType)
{
    setField(field);
    setSortType(sortType);
}

/**
 * 获取排序方式
 * @return Qt::SortOrder 排序方式
 */
Qt::SortOrder UiSortDialog::sortType() const
{
    return m_sortType;
}

/**
 * 设置排序方式
 * @param sortType Qt::SortOrder 排序方式
 */
void UiSortDialog::setSortType(const Qt::SortOrder &sortType)
{
    m_sortType = sortType;
}

/**
 * 获取排序字段
 * @return QString 排序字段
 */
QString UiSortDialog::field() const
{
    return m_field;
}

/**
 * 设置排序字段
 * @param field QString 排序字段
 */
void UiSortDialog::setField(const QString &field)
{
    m_field = field;
}

//---

#include <QPainter>

/**
 * @brief 构造函数
 * 
 * @param parent 父对象
 */
CSortDelegate::CSortDelegate(QObject *parent):QStyledItemDelegate(parent)
{

}

/**
 * @brief 绘制列表项
 * 
 * @param painter 绘图器
 * @param option 绘制选项
 * @param index 列表项索引
 */
void CSortDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    painter->save();

    // 设置绘制选项以获得更好的视觉效果
    painter->setRenderHint(QPainter::SmoothPixmapTransform);
    painter->setRenderHint(QPainter::Antialiasing);


    // 获取要显示的数据
    QString dataStr = index.data(Qt::DisplayRole).toString();

    // 如果数据非空，则进行绘制
    if (!dataStr.isEmpty())
    {
        // 构建圆角背景矩形
        QRectF roundedBackRect;
        roundedBackRect.setX(option.rect.x());
        roundedBackRect.setY(option.rect.y());
        roundedBackRect.setWidth(this->sizeHint(option, index).width());
        roundedBackRect.setHeight(30);

        // 绘制圆角背景，根据选中状态选择不同的颜色
        if(option.state & QStyle::State_Selected)
            painter->setBrush(QColor("#0075ff"));
        else
            painter->setBrush(QColor("#D5DBEE"));
        painter->drawRoundedRect(roundedBackRect, 15, 15);

        // 设置字体并绘制文本
        QFont font_yahei_20;
        font_yahei_20.setFamily("Microsoft YaHei UI");
        font_yahei_20.setPixelSize(10);
        QPoint contentPoint(option.rect.x() + 20, option.rect.y() + (this->sizeHint(option, index).height() - font_yahei_20.pixelSize()) / 2  + font_yahei_20.pixelSize() - 2);
        painter->setFont(font_yahei_20);
        painter->setBrush(Qt::NoBrush);
        if(option.state & QStyle::State_Selected)
            painter->setPen(Qt::white);
        else
            painter->setPen(Qt::black);
        painter->drawText(contentPoint, dataStr);
    }
}

/**
 * @brief 获取列表项大小提示
 * 
 * @param option 绘制选项
 * @param index 列表项索引
 * @return QSize 列表项大小
 */
QSize CSortDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QStyleOptionViewItem o = option;
    QStyle::State s = o.state;

    // 获取要显示的数据
    QString dataStr = index.data(Qt::DisplayRole).toString();

    // 计算数据字符串的宽度
    QFont font_yahei_20;
    font_yahei_20.setFamily("Microsoft YaHei UI");
    font_yahei_20.setPixelSize(10);
    QFontMetrics metrix(font_yahei_20);
    QRect font_rect = metrix.boundingRect(dataStr);
    int dataStrWidth = font_rect.width();

    // 计算并返回列表项大小
    QSize size;
    int h_padding = 20; // 左右内边距
    size.setWidth(h_padding*2+dataStrWidth);
    size.setHeight(30);

    return size;
}

#include <QStandardItemModel>
/**
 * @class UiSortListView
 * 自定义的排序列表视图类，继承自QListView，用于实现特定的列表视图效果。
 */
UiSortListView::UiSortListView(QWidget *parent):QListView(parent)
{
    // 初始化设置，配置列表为图标模式，流式从左到右，自适应项的大小，禁用拖拽和编辑。
    this->setViewMode(QListView::IconMode);
    this->setFlow(QListView::LeftToRight);
    this->setResizeMode(QListView::Adjust);
    this->setDragEnabled(false);
    this->setEditTriggers(QAbstractItemView::NoEditTriggers);

    // 禁用滚动条，设置背景色。
    this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    this->setSpacing(10); // 设置项之间的间距
    this->setStyleSheet("background:#303642;");
}

/**
 * @brief 获取选中项的索引列表。
 * 
 * @return QModelIndexList 返回选中项的索引列表。
 */
QModelIndexList UiSortListView::selectedIndexes() const
{
    return QListView::selectedIndexes();
}

/**
 * @brief 处理窗口大小变化事件，动态调整列表高度以适应内容。
 * 
 * @param e 指向QResizeEvent的指针，提供大小变化的详细信息。
 */
void UiSortListView::resizeEvent(QResizeEvent* e)
{
    // 当大小改变时，重新布局并调整高度以刚好包含所有项。
    this->model()->layoutChanged();
    QRect r = this->visualRect(this->model()->index(this->model()->rowCount() - 1, 0));
    this->setFixedHeight(r.y() + r.height() + this->spacing());
}
